SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE PROCEDURE [dbo].[paEjecutarBajasDeServicios]

-- <ACTUALIZACIONES> 21/ 04/ 2009 por OTERO, Marcelo y SANES Jorge. (Se mejoro manejo de transacciones)
-- <ACTUALIZACIONES> 06 - 05 - 2009 por OTERO, Marcelo y SANES,  Jorge, Se Cambio Manejo de Transacciones 
-- <ACTUALIZACIONES> 23 - 03 - 2010 por OTERO, Marcelo y SANES,  Jorge, Se agrego el Insert en la Tb_RelInterservicio para las bajas por transferencia con las altas del mismo tipo

@idCola INT,
@AsignarNorma BIT,
@SubServicioDeLaNorma INT OUTPUT,
@EsForzado BIT
AS
SET NOCOUNT ON
SET DATEFORMAT dmy

DECLARE @Error INT
DECLARE @Agente INT
DECLARE @Plaza INT
DECLARE @Fecha DATETIME
DECLARE @Organizacion INT
DECLARE @REsponsable INT
DECLARE @Fecha1 DATETIME
DECLARE @Fecha2 DATETIME
DECLARE @FechaTermino DATETIME
DECLARE @SitRev INT
DECLARE @Nivel INT
DECLARE @modalidad INT
DECLARE @zona INT
DECLARE @cargosalarial INT
DECLARE @Licencia INT
DECLARE @cantidadhoras INT
DECLARE @movimiento INT
DECLARE @estado INT
DECLARE @observaciones varchar(255)
DECLARE @CausaAlta INT
DECLARE @CausaBaja INT
DECLARE @NormaBaja INT
DECLARE @ServicioLigado INT
DECLARE @PlazaDestino INT --Plaza para realizar el Pase a Disponibilidad
DECLARE @ServicioDisponibilidad INT
DECLARE @TipoDePaquete INT
DECLARE @idPaquete INT
DECLARE @normadebaja INT
DECLARE @Usuario INT
DECLARE @ErrorC INT

DECLARE @ArmoCursor INT 

SELECT @ArmoCursor = 0 

BEGIN TRANSACTION Baja

SELECT @Error = 0, @ErrorC = 0

-- Se obtiene el Codigo de Usuario a partir del usuario NT
SELECT @Usuario = IdUsuario FROM tb_Usuarios WHERE  NTUser = USER_NAME()

DECLARE @contador INT
UPDATE tb_MovimientosDocentes SET contador = contador + 1, anio = year(getdate()) WHERE idMovimiento = 2

SELECT @Error = @@Error
IF @Error <> 0
		GOTO SALIR


SELECT @contador = contador FROM tb_MovimientosDocentes where idMovimiento = 2
SELECT @Contador = MAX(NormaTemporalBaja)+1 FROM tb_SubServiciosAgentes 

SELECT @Agente = Agente, @Plaza = Plaza, @Fecha = Fecha, @Organizacion = Organizacion, @Responsable = Responsable, @Fecha1 = Fecha1,
	@Fecha2 = Fecha2, @SitRev = SitRev, @Nivel = Nivel, @Modalidad = Modalidad, @Zona = Zona, @cargosalarial = cargosalarial, @licencia = licencia,
	@cantidadhoras = cantidadhoras, @movimiento = movimiento, @Estado = Estado, @Observaciones = observaciones, @CausaAlta = CausaAlta, 
	@FechaTermino = FechaTermino
    FROM tb_ColaDeMovimientos 
    WHERE idCola = @idCola

-- Se obtiene la Norma del Movimiento
IF @AsignarNorma = 1
BEGIN
	INSERT tb_Normas SELECT CONVERT(VARCHAR, UltimaNorma) +'-'+ CONVERT(VARCHAR, ISNULL(YEAR(GETDATE()), YEAR(GETDATE()))), 1, 0, NULL, GETDATE(), NULL, 2, 0, @Usuario FROM tb_MovimientosDocentes WHERE Mnemo = 'T'
	SELECT @Error = @@Error
	IF @Error <> 0
    		GOTO SALIR

	SELECT @NormaDeBaja = @@IDENTITY

	UPDATE tb_MovimientosDocentes SET UltimaNorma = UltimaNorma + 1 WHERE Mnemo = 'T'

	SELECT @Error = @@Error
	IF @Error <> 0
    		GOTO SALIR

END
ELSE
	SELECT @NormaDeBaja = NULL

-- Si el Estado es Rechazado, Ejecutado o Ejecutado Forzado
if @Estado = 2 or @Estado = 4 or @Estado = 5
           BEGIN 
	SELECT @Error = 3
	GOTO SALIR
          END 	

DECLARE @Servicio INT
DECLARE @SubServicio INT
DECLARE @idPlaza INT
DECLARE @FFecha2 DATETIME
DECLARE @IdSubServicio INT
DECLARE @ServicioRelacionado INT 

SELECT @FFecha2 = CAST(@Fecha2 AS DATETIME)

SELECT @ArmoCursor = 1

DECLARE xPlazas CURSOR forward_only FOR SELECT idPlaza, Servicio FROM tb_PlazasDeMovimiento WHERE idCola = @idCola
OPEN xPlazas
FETCH NEXT FROM xPlazas INTO @idPlaza, @SubServicio

SET @IdSubServicio = @SubServicio

--declare @contador int
WHILE @@FETCH_STATUS = 0
BEGIN

	SELECT @CausaBaja = CausaBaja, @PlazaDestino = PlazaDestino, @ServicioRelacionado = IdServicioRelacionado FROM tb_PlazasDeMovimiento WHERE idPlaza = @idPlaza and idCola = @idCola
	
	SELECT @Servicio = (SELECT ServicioAgente FROM tb_SubServiciosAgentes WHERE idsubServicio = @SubServicio)

	IF EXISTS (SELECT top 1 IdSubServicio FROM tb_SubServiciosAgentes WHERE FechaAlta = @Fecha2 And IdSubServicio = @SubServicio)
		BEGIN
			DECLARE @IdssAnterior INT
			SELECT @IdssAnterior = idSubServicio FROM tb_SubServiciosAgentes WHERE ServicioAgente = @Servicio And FechaBaja = DATEADD(day,-1,@Fecha2)		
			UPDATE tb_SubServiciosAgentes SET Baja = 'S', FechaBaja = DATEADD(DAY,-1,@Fecha2), normatemporalbaja=(Select max(normatemporalbaja)+1 FROM tb_SubServiciosAgentes), NormaFin = @NormadeBaja WHERE IdSubServicio = @idSubServicio

			SELECT @Error = @@Error
			IF @Error <> 0
		    		GOTO SALIR

			--Update tb_SubServiciosAgentes Set Movimiento = 2 Where IdSubServicio = @idssAnterior Where idSubServicio = @SubServicio
			UPDATE tb_ServiciosAgentes SET Baja = 'S', FechaBaja = DATEADD(DAY, -1, @Fecha2), CausaBaja = @CausaBaja, NormaBaja = @NormadeBaja WHERE IdServicioAgente = @Servicio

			SELECT @Error = @@Error
			IF @Error <> 0
		    		GOTO SALIR

			--Delete From tb_SubServiciosAgentes Where IdSubServicio = @SubServicio
		END
	ELSE
		BEGIN
			
			UPDATE tb_SubServiciosAgentes set baja = 'S', FechaBaja = dateadd(day,-1,@FFecha2), movimiento= 2, NormaFin = @NormadeBaja, normatemporalBaja = @contador where idSubServicio = @SubServicio
			SELECT @Error = @@Error
			IF @Error <> 0
		    		GOTO SALIR
		
			SELECT @TipoDePaquete = TipoPaquete FROM tb_Plazas INNER JOIN tb_PaquetesDePlazas ON idPaquete = Paquete and idPlaza = @idPlaza --Si esto no es nulo -> es una plaza componente
	
			UPDATE tb_ServiciosAgentes SET baja = 'S', FechaBaja = dateadd(day,-1,@FFecha2), NormaBaja = @NormadeBaja, CausaBaja = @CausaBaja where idServicioAgente = @Servicio
			SELECT @Error = @@Error
			IF @Error <> 0
		    		GOTO SALIR
	
			/*
			if @ServicioLigado is not null
			begin
				update tb_ServiciosAgentes set baja = 'S', fechabaja = @FFecha2 where idServicioAgente = @ServicioLigado
				update tb_SubServiciosAgentes set baja = 'S', fechabaja = @FFecha2 where ServicioAgente = @ServicioLigado and fechabaja is null
			end
			*/
	
		END

	IF (@Agente = (SELECT DuenoActual FROM tb_Plazas WHERE idPlaza = @idPlaza))
		BEGIN
			UPDATE tb_Plazas SET DuenoActual = null, SitRevDuenoActual = null WHERE idPlaza = @idPlaza
			SELECT @Error = @@Error
			IF @Error <> 0
		    		GOTO SALIR

		END
	IF (@Agente = (SELECT UltimoDocente FROM tb_Plazas WHERE idPlaza = @idPlaza))
		BEGIN	
			UPDATE tb_Plazas SET UltimoDocente = null WHERE idPlaza = @idPlaza

			SELECT @Error = @@Error
			IF @Error <> 0
		    		GOTO SALIR

		END

	-- Si estoy dando de baja un servicio que es LE
	SELECT @servicioligado = Servicioligado FROM tb_ServiciosAgentes WHERE idServicioAgente = @Servicio
	
	-- Si se trata del servicio ligado a la licencia > doy de baja la licencia del servicio base.  (HAY QUE HACERLO POR BAJA DE LICENCIA DEL SERVICIO BASE)
	-- Si se trata del servicio base > doy de baja el servicio LE abierto a la fecha	
	IF EXISTS(SELECT top 1 idServicio FROM tb_RelInterServicios, tb_ServiciosAgentes s WHERE idServicio2 = @Servicio and idServicio = idServicioAgente and s.baja='N' and FechaAlta <= @Fecha2)
		BEGIN
			SELECT @ServicioLigado = idServicio FROM tb_RelInterServicios WHERE idServicio2 = @Servicio
	
			If @ServicioLigado IS NOT NULL
			BEGIN		
	
				UPDATE tb_ServiciosAgentes SET baja='S', FechaBaja = dateadd(day,-1,@Fecha2) WHERE idServicioagente = @ServicioLigado

				SELECT @Error = @@Error
				IF @Error <> 0
			    		GOTO SALIR

			
				UPDATE tb_SubServiciosAgentes SET baja='S', FechaBaja=dateadd(day,-1,@Fecha2) WHERE servicioagente = @ServicioLigado and fechabaja is null

				SELECT @Error = @@Error
				IF @Error <> 0
			    		GOTO SALIR

			END
			
		END

	IF @CausaBaja = 8 and @PlazaDestino <> -1 --Si es Pase a Disponibilidad y existe la plaza destino
		BEGIN
			-- Inserta el nuevo Servicio en Disponibilidad
			INSERT INTO tb_ServiciosAgentes (Agente, Asignatura, Baja, CargoSalarial, CausaAlta, ClavePSalarial, EstadoLiqExt, FechaAlta, FechaBaja, FechaTermino,
			Horas, Liquida, NroDeOrden9, Presupuesto, RegimenDesignacion, RegimenLaboral, RegimenSalarial, ServicioQueSuple, Sistema, SituacionRevista,
			TipoDeServicio, TipoDeFuncion, Finalidad, Financiamiento, UbicacionOrig, NormaAlta, NormaBaja, Vacante, ServicioLigado, CausaBaja) 
			SELECT Agente, Asignatura, 'N', CargoSalarial, 4, ClavePSalarial, EstadoLiqExt, @Fecha2, null, FechaTermino,
			Horas, Liquida, NroDeOrden9, Presupuesto, RegimenDesignacion, RegimenLaboral, RegimenSalarial, ServicioQueSuple, Sistema, SituacionRevista,
			TipoDeServicio, TipoDeFuncion, Finalidad, Financiamiento, UbicacionOrig, NormaAlta, NormaBaja, Vacante, null, null
			FROM tb_ServiciosAgentes WHERE IdServicioAgente = @Servicio		
	
			SELECT @Error = @@Error
			IF @Error <> 0
		    		GOTO SALIR

			SELECT  @ServicioDisponibilidad = @@IDENTITY
	
			-- Inserto el SS correspondiente al S anterior
			SELECT @Modalidad = grupocarreras, @Nivel = nivel, @Zona = Zona FROM tb_Divisiones d, tb_Plazas p, tb_SubOrganizaciones so WHERE so.idSubOrganizacion = idSubOrg and idDivision = p.Division and idPlaza = @PlazaDestino
			SELECT @Contador = MAX(normatemporalBaja)+1 FROM tb_SubServiciosAgentes		

			INSERT INTO tb_SubServiciosAgentes (Baja, CodEnfermedad, EntidadCertificadora, EstadoLiqExt, FechaAlta, FechaBaja, FechaCertificado,
			FechaTermino, Licencia, Modalidad, Movimiento, Nivel, NormaFin, NormaInicio, NroCertificado, NroOrden9, Plaza, ServicioAgente, SituacionExtraordinaria,
			SituacionLaboral, TramiteAlta, TramiteBaja, Zona, NormaTemporal, NormaTemporalBaja)	
			VALUES ('N', 0, 1, 1, @Fecha2, null, null, null, null, @Modalidad, 1,@Nivel, null, null, null, 1, @PlazaDestino, @ServicioDisponibilidad, 1,
			5, null, null, @Zona, @contador, @Contador)

			SELECT @Error = @@Error
			IF @Error <> 0
		    		GOTO SALIR
	
			--Relaciona los Servicios	
			INSERT tb_RelInterServicios SELECT @ServicioDisponibilidad, @Servicio, 2, null, @Fecha2, 'N', null, null

			SELECT @Error = @@Error
			IF @Error <> 0
		    		GOTO SALIR

		END

	IF @CausaBaja = 7 AND @ServicioRelacionado > 0 
		BEGIN
			-- Se crea una relacion entre el SERVICIO BAJADO y el  nuevo servicio dado de alta por transferencia, dicha alta debio ser previa a esta baja
			INSERT Tb_RelInterServicios SELECT @Servicio, @ServicioRelacionado, 4, 'Relacion Manual Baja con  Alta por Transferencia', @Fecha2, 'N', NULL, NULL

			SELECT @Error = @@Error
			IF @Error <> 0
		    		GOTO SALIR
			
		END

	FETCH NEXT FROM xPlazas INTO @idPlaza, @SubServicio 


	--06/12/2007 se quito ya que se cambio la manera de obtener el lugar de pago de los conceptos 12,33 y 36
	/*
	--VERIFICACION DE CONCEPTOS DEL AGENTE PARA LA LIQUIDACION
	-- Se cambio por cambio en forma de Calcular Concepto 12 - Salario Familiar ( Se agrego AND Concepto IN (33,36))
	IF EXISTS(SELECT top 1 agente FROM tb_ConceptosDelAgentePorOrganizacion WHERE Agente = @Agente AND Organizacion = @Organizacion AND Concepto IN (33,36))
		AND NOT EXISTS(SELECT top 1 agente FROM tb_ServiciosAgentes WHERE Agente = @Agente AND UbicacionOrig = @Organizacion AND FechaBaja IS NULL)
	BEGIN
		-- Se cambio por cambio en forma de Calcular Concepto 12 - Salario Familiar ( Se agrego AND Concepto IN (33,36))
		DELETE FROM tb_ConceptosDelAgentePorOrganizacion WHERE Agente = @Agente AND Organizacion = @Organizacion AND Concepto IN (33,36)
		--Si existe algun servicio privado activo para el Agente
		--IF EXISTS(SELECT top 1 agente FROM tb_ServiciosAgentes S INNER JOIN tb_Organizaciones O On IdOrganizaciones = UbicacionOrig WHERE Agente = @Agente AND UbicacionOrig = @Organizacion AND S.FechaBaja IS NULL AND EsPrivada = 'S')
		IF EXISTS(SELECT top 1 agente FROM tb_ServiciosAgentes S INNER JOIN tb_Organizaciones O On IdOrganizaciones = UbicacionOrig WHERE Agente = @Agente AND S.FechaBaja IS NULL AND EsPrivada = 'S')
		BEGIN
			DECLARE @NuevaOrganizacion INT
			
			--Se busca la nueva organizacion donde cobrar con la fecha mas antigua del servicio
			SELECT @NuevaOrganizacion = MIN(UbicacionOrig) FROM tb_ServiciosAgentes S
			INNER JOIN tb_Organizaciones O ON IdOrganizaciones = UbicacionOrig
			INNER JOIN tb_SubServiciosAgentes SS ON S.IdServicioAgente = SS.ServicioAgente
			WHERE Agente = @Agente 
			AND EsPrivada = 'S'		
			AND SS.FechaBaja IS NULL
			AND S.FechaAlta = (SELECT MIN(FechaAlta) FROM tb_ServiciosAgentes S INNER JOIN tb_Organizaciones O ON UbicacionOrig = IdOrganizaciones WHERE EsPrivada = 'S' AND S.FechaBaja IS NULL AND Agente = @Agente)

			-- Nueva Organizacion para cobrar SALARIO FAMILIAR Y ESTIMULOS
			-- Se cambio por cambio en forma de Calcular Concepto 12 - Salario Familiar
			--INSERT INTO tb_ConceptosDelAgentePorOrganizacion (Agente, Organizacion, Concepto) VALUES (@Agente, @NuevaOrganizacion, 12)
			--INSERT INTO tb_ConceptosDelAgentePorOrganizacion (Agente, Organizacion, Concepto) VALUES (@Agente, @NuevaOrganizacion, 33)

		END	
	END
	*/

END
-- actualizo el estado de la cola en Ejecutado OK
UPDATE tb_ColaDeMovimientos SET Estado = CASE WHEN @EsForzado = 0 THEN 4 ELSE 5 END, NTUserEjecutor = SYSTEM_USER, FechaEjecucion = GETDATE()  WHERE idCola = @idCola

SELECT @Error = @@Error
IF @Error <> 0
		GOTO SALIR

--CLOSE xPlazas
--DEALLOCATE xPlazas

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Se cambio esto, porque en la llamada al reporte BajaDeServicio.rpt necesita del ID de Servicio - 15-06-2007
--SELECT @SubServicioDeLaNorma = @IdSubServicio
SELECT @SubServicioDeLaNorma = ServicioAgente FROM Tb_SubServiciosAgentes WHERE IdSubServicio= @IdSubServicio
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

SALIR:
IF  @ArmoCursor = 1
   BEGIN
	CLOSE xPlazas
	DEALLOCATE xPlazas
   END 

IF @Error = 0
	COMMIT TRANSACTION Baja
ELSE
	ROLLBACK TRANSACTION Baja
GO
GRANT EXECUTE ON  [dbo].[paEjecutarBajasDeServicios] TO [PersonalDocente]
GO
